<!DOCTYPE html>
<html lang="zh">
<head>
  <meta charset="UTF-8">
  <title>Symbol</title>
</head>
<body>
<!--
  前言：ES5 中对象的属性名都是字符串，容易造成重名，污染环境
  Symbol：
    概念：ES6 中的添加了一种原始数据类型 symbol(已有的原始数据类型：String, Number, boolean, null, undefined, 对象)
    特点：
      1、Symbol 属性对应的值是唯一的，解决命名冲突问题
      2、Symbol 值不能与其他数据进行计算，包括同字符串拼串
      3、for in, for of 遍历时不会遍历 symbol 属性。
    使用：
      1、调用 Symbol 函数得到 symbol 值
        let symbol = Symbol();
        let obj = {};
        obj[symbol] = 'hello';
      2、传参标识
        let symbol = Symbol('one');
        let symbol2 = Symbol('two');
        console.log(symbol); // Symbol('one')
        console.log(symbol2); // Symbol('two')
      3、内置 Symbol 值
        * 除了定义自己使用的 Symbol 值以外，ES6 还提供了 11 个内置的 Symbol 值，指向语言内部使用的方法。
        - Symbol.iterator
        * 对象的 Symbol.iterator 属性，指向该对象的默认遍历器方法(后边讲)
-->
<script type="text/javascript">
  window.onload = function () {
    let symbol = Symbol();
    console.log(typeof symbol);
    console.log(symbol);

    // 用作对象的属性(唯一)
    let obj = {username: 'kobe', age: 39};
    obj[symbol] = 'hello';
    obj[symbol] = 'symbol';
    console.log(obj);
    for (let i in obj) {
      console.log(i);
    }
  }
</script>
</body>
</html>
